﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Configurator
{
    /// <summary>
    /// Подэлемент в списке конфигурации.
    /// </summary>
    public class SubItem
    {
        /// <summary>
        /// Имя подэлемента.
        /// </summary>
        private string name;

        /// <summary>
        /// Список значений подэлемента.
        /// </summary>
        private List<Pair> values;

        /// <summary>
        /// Инициализирует подэлемент.
        /// </summary>
        /// <param name="name">Имя подэлемента.</param>
        /// <param name="values">Список значений подэлемента.</param>
        public SubItem(string name, List<Pair> values)
        {
            if (string.Empty == name)
            {
                throw new System.ArgumentException("Имя подэлемента не может быть пустым.");
            }

            this.name = name;
            this.values = values;
        }

        /// <summary>
        /// Возвращает или задает имя подэлемента.
        /// </summary>
        public string Name
        {
            get { return this.name; }
            set { this.name = value; }
        }

        /// <summary>
        /// Возвращает или задает список значений подэлемента.
        /// </summary>
        public List<Pair> Values
        {
            get { return this.values; }
            set { this.values = value; }
        }

        /// <summary>
        /// Добавляет пару к списку значений.
        /// </summary>
        /// <param name="newPair">Новая пара.</param>
        /// <returns>Возвращает true, если пара успешно добавлена и false, если такое значение уже есть.</returns>
        public bool AddPair(Pair newPair)
        {
            if (this.values.Contains(newPair))
            {
                return false;
            }

            this.values.Add(newPair);

            return true;
        }

        /// <summary>
        /// Удаляет пару из списка значений.
        /// </summary>
        /// <param name="removingPair">Удаляемая пара.</param>
        /// <returns>Возвращает true, если элемент удален, в противном случае - false.</returns>
        public bool RemovePair(Pair removingPair)
        {
            return this.values.Remove(removingPair);
        }

        /// <summary>
        /// Возвращает значения в текстовом виде.
        /// </summary>
        /// <param name="separator">Строковый разделитель.</param>
        /// <returns>Текстовое представление значений.</returns>
        public string GetStringValues(string separator = " ")
        {
            var values = new StringBuilder();

            // Добавляем все до последнего с разделителем
            for (int i = 0; i < this.values.Count - 1; ++i)
            {
                values.Append(this.values[i].ToString()).Append(separator);

            }

            // Добавляем последний
            if (this.values.Count > 0)
            {
                values.Append(this.values[this.values.Count - 1].ToString());
            }

            return values.ToString();
        }

        /// <summary>
        /// Возвращает текстовое представление подэлемента.
        /// </summary>
        /// <returns>Возвращает System.string, который представляет текущий обьект.</returns>
        public override string ToString()
        {
            return string.Format("{0}: {1}", this.name, this.GetStringValues());
        }
    }
}
